package ThreadingSafety;

import java.util.concurrent.locks.ReentrantLock;

/**
 *  ReentrantLock(可重入锁)
 *
 *  synchronized也是可重入锁,但是有的操作它仍然做不到,
 *  ReentrantLock是synchronized的一个补充.
 *
 *  ReentrantLock核心用法:
 *  1. lock() 加锁
 *  2. unlock() 解锁
 *
 *  以下操作是synchronized没有的:
 *  1. tryLock() 试试能不能加锁. 并且还能指定加锁等待的超时时间.
 *  2. ReentrantLock 还可以实现公平锁(遵守先来后到),默认是非公平锁.
 *  3. synchronized 是搭配 wait/notify 实现等待通知机制的.唤醒操作是随机唤醒一个等待的线程.
 *     ReentrantLock 搭配Condition类实现的.唤醒操作是可以指定唤醒哪个等待的线程的.
 *  面试常见问题: synchronized 与 ReentrantLock 的区别.
 */
public class TestDemo28 {
    public static void main(String[] args) {
        // 非公平锁
        ReentrantLock lock = new ReentrantLock();
        // 公平锁
        ReentrantLock lock2 = new ReentrantLock(true);

        // 加锁解锁要这么写, 原因见板书.
        try {
            lock.lock(); // 加锁

            // 代码逻辑

        }finally {
            // 解锁
            lock.unlock();
        }


    }
}
